package com.tang.juc.container.unsafe;

import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 * @author tlm
 * @version 1.0
 * @date 2020/4/20 21:19
 * 集合不安全问题之ArrayList不安全
 *         故障现象：
 *         java.util.ConcurrentModificationException   并发修改异常
 *         2导致原因：
 *         并发争抢修改导致，参考我们的花名册签名情况。
 *         一个人正在写入，另外一个同学过来抢夺，导致数据不一致异常，即并发修改异常。
 *         解决方案：
 *         1.使用Vector
 *         2.使用Collections工具类：Collections.synchronizedList(new ArrayList<>());
 *         3.使用juc下的CopyOnWriteArrayList（写时复制）
 */
public class ArrayListUnsafeDemo {
    public static void main(String[] args) {

        //多线程环境下会报错：java.util.ConcurrentModificationException   并发修改异常
//        List<String> list = new ArrayList<>();
//        for (int i = 1; i <= 30; i++) {
//            new Thread(() -> {
//                list.add(UUID.randomUUID().toString().substring(0,8));
//                System.out.println(list);
//            }, String.valueOf(i)).start();
//        }

        //使用Collections工具类解决
//        List<String> list1 = Collections.synchronizedList(new ArrayList<>());
//        for (int i = 1; i <= 30; i++) {
//            new Thread(() -> {
//                list1.add(UUID.randomUUID().toString().substring(0,8));
//                System.out.println(list1);
//            }, String.valueOf(i)).start();
//        }
        //使用juc下的CopyOnWriteArrayList
        List<String> list2 = new CopyOnWriteArrayList<>();
        for (int i = 1; i <= 30; i++) {
            new Thread(() -> {
                list2.add(UUID.randomUUID().toString().substring(0,8));
                System.out.println(list2);
            }, String.valueOf(i)).start();
        }


    }
}
